#include <bits/stdc++.h>

using namespace std;

// 思路：
// 1.k为位置，从1开始，a数组用于保存已经排列的数，v用于判断下标所对应的数字是否已经被使用
// 2.如果k==r+1，那么说明r个数据已经排列好，那么直接输出，不用再继续搜索
// 3.进行如果发现该数大于前一个数据，那么递归搜索，否则回溯


int a[21],v[21],n,r;

void search(int k) {
    if (k == r + 1) {
        for(int i = 1;i <= r;i++) {
            printf("%3d",a[i]);
        }
        cout << endl;
        return;
    }
    for(int i = 1;i <= n;i ++) {
        if(!v[i]) {
            v[i] = 1;
            a[k] = i;
            if (a[k] > a[k - 1])
                search(k + 1);
            v[i] = 0;
        }
    }
}

int main() {
    cin >> n >> r;
    search(1);
}